home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / distutils / command / bdist_wininst.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2005-10-18  |  10KB  |  240 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. """distutils.command.bdist_wininst
  5.  
  6. Implements the Distutils 'bdist_wininst' command: create a windows installer
  7. exe-program."""
  8. __revision__ = '$Id: bdist_wininst.py,v 1.56 2004/11/10 22:23:14 loewis Exp $'
  9. import sys
  10. import os
  11. import string
  12. from distutils.core import Command
  13. from distutils.util import get_platform
  14. from distutils.dir_util import create_tree, remove_tree
  15. from distutils.errors import *
  16. from distutils.sysconfig import get_python_version
  17. from distutils import log
  18.  
  19. class bdist_wininst(Command):
  20.     description = 'create an executable installer for MS Windows'
  21.     user_options = [
  22.         ('bdist-dir=', None, 'temporary directory for creating the distribution'),
  23.         ('keep-temp', 'k', 'keep the pseudo-installation tree around after ' + 'creating the distribution archive'),
  24.         ('target-version=', None, 'require a specific python version' + ' on the target system'),
  25.         ('no-target-compile', 'c', 'do not compile .py to .pyc on the target system'),
  26.         ('no-target-optimize', 'o', 'do not compile .py to .pyo (optimized)on the target system'),
  27.         ('dist-dir=', 'd', 'directory to put final built distributions in'),
  28.         ('bitmap=', 'b', 'bitmap to use for the installer instead of python-powered logo'),
  29.         ('title=', 't', 'title to display on the installer background instead of default'),
  30.         ('skip-build', None, 'skip rebuilding everything (for testing/debugging)'),
  31.         ('install-script=', None, 'basename of installation script to be run afterinstallation or before deinstallation'),
  32.         ('pre-install-script=', None, 'Fully qualified filename of a script to be run before any files are installed.  This script need not be in the distribution')]
  33.     boolean_options = [
  34.         'keep-temp',
  35.         'no-target-compile',
  36.         'no-target-optimize',
  37.         'skip-build']
  38.     
  39.     def initialize_options(self):
  40.         self.bdist_dir = None
  41.         self.keep_temp = 0
  42.         self.no_target_compile = 0
  43.         self.no_target_optimize = 0
  44.         self.target_version = None
  45.         self.dist_dir = None
  46.         self.bitmap = None
  47.         self.title = None
  48.         self.skip_build = 0
  49.         self.install_script = None
  50.         self.pre_install_script = None
  51.  
  52.     
  53.     def finalize_options(self):
  54.         if self.bdist_dir is None:
  55.             bdist_base = self.get_finalized_command('bdist').bdist_base
  56.             self.bdist_dir = os.path.join(bdist_base, 'wininst')
  57.         
  58.         if not self.target_version:
  59.             self.target_version = ''
  60.         
  61.         if not (self.skip_build) and self.distribution.has_ext_modules():
  62.             short_version = get_python_version()
  63.             if self.target_version and self.target_version != short_version:
  64.                 raise DistutilsOptionError, "target version can only be %s, or the '--skip_build' option must be specified" % (short_version,)
  65.             
  66.             self.target_version = short_version
  67.         
  68.         self.set_undefined_options('bdist', ('dist_dir', 'dist_dir'))
  69.         if self.install_script:
  70.             for script in self.distribution.scripts:
  71.                 if self.install_script == os.path.basename(script):
  72.                     break
  73.                     continue
  74.             else:
  75.                 raise DistutilsOptionError, "install_script '%s' not found in scripts" % self.install_script
  76.         
  77.  
  78.     
  79.     def run(self):
  80.         if sys.platform != 'win32':
  81.             if self.distribution.has_ext_modules() or self.distribution.has_c_libraries():
  82.                 raise DistutilsPlatformError('distribution contains extensions and/or C libraries; must be compiled on a Windows 32 platform')
  83.             
  84.         if not self.skip_build:
  85.             self.run_command('build')
  86.         
  87.         install = self.reinitialize_command('install', reinit_subcommands = 1)
  88.         install.root = self.bdist_dir
  89.         install.skip_build = self.skip_build
  90.         install.warn_dir = 0
  91.         install_lib = self.reinitialize_command('install_lib')
  92.         install_lib.compile = 0
  93.         install_lib.optimize = 0
  94.         if self.distribution.has_ext_modules():
  95.             target_version = self.target_version
  96.             if not target_version:
  97.                 if not self.skip_build:
  98.                     raise AssertionError, 'Should have already checked this'
  99.                 target_version = sys.version[0:3]
  100.             
  101.             plat_specifier = '.%s-%s' % (get_platform(), target_version)
  102.             build = self.get_finalized_command('build')
  103.             build.build_lib = os.path.join(build.build_base, 'lib' + plat_specifier)
  104.         
  105.         for key in ('purelib', 'platlib', 'headers', 'scripts', 'data'):
  106.             value = string.upper(key)
  107.             if key == 'headers':
  108.                 value = value + '/Include/$dist_name'
  109.             
  110.             setattr(install, 'install_' + key, value)
  111.         
  112.         log.info('installing to %s', self.bdist_dir)
  113.         install.ensure_finalized()
  114.         sys.path.insert(0, os.path.join(self.bdist_dir, 'PURELIB'))
  115.         install.run()
  116.         del sys.path[0]
  117.         mktemp = mktemp
  118.         import tempfile
  119.         archive_basename = mktemp()
  120.         fullname = self.distribution.get_fullname()
  121.         arcname = self.make_archive(archive_basename, 'zip', root_dir = self.bdist_dir)
  122.         self.create_exe(arcname, fullname, self.bitmap)
  123.         log.debug("removing temporary file '%s'", arcname)
  124.         os.remove(arcname)
  125.         if not self.keep_temp:
  126.             remove_tree(self.bdist_dir, dry_run = self.dry_run)
  127.         
  128.  
  129.     
  130.     def get_inidata(self):
  131.         lines = []
  132.         metadata = self.distribution.metadata
  133.         lines.append('[metadata]')
  134.         if not metadata.long_description:
  135.             pass
  136.         info = '' + '\n'
  137.         
  138.         def escape(s):
  139.             return string.replace(s, '\n', '\\n')
  140.  
  141.         for name in [
  142.             'author',
  143.             'author_email',
  144.             'description',
  145.             'maintainer',
  146.             'maintainer_email',
  147.             'name',
  148.             'url',
  149.             'version']:
  150.             data = getattr(metadata, name, '')
  151.             if data:
  152.                 info = info + '\n    %s: %s' % (string.capitalize(name), escape(data))
  153.                 lines.append('%s=%s' % (name, escape(data)))
  154.                 continue
  155.         
  156.         lines.append('\n[Setup]')
  157.         if self.install_script:
  158.             lines.append('install_script=%s' % self.install_script)
  159.         
  160.         lines.append('info=%s' % escape(info))
  161.         lines.append('target_compile=%d' % (not (self.no_target_compile)))
  162.         lines.append('target_optimize=%d' % (not (self.no_target_optimize)))
  163.         if self.target_version:
  164.             lines.append('target_version=%s' % self.target_version)
  165.         
  166.         if not self.title:
  167.             pass
  168.         title = self.distribution.get_fullname()
  169.         lines.append('title=%s' % escape(title))
  170.         import time as time
  171.         import distutils as distutils
  172.         build_info = 'Built %s with distutils-%s' % (time.ctime(time.time()), distutils.__version__)
  173.         lines.append('build_info=%s' % build_info)
  174.         return string.join(lines, '\n')
  175.  
  176.     
  177.     def create_exe(self, arcname, fullname, bitmap = None):
  178.         import struct as struct
  179.         self.mkpath(self.dist_dir)
  180.         cfgdata = self.get_inidata()
  181.         installer_name = self.get_installer_filename(fullname)
  182.         self.announce('creating %s' % installer_name)
  183.         if bitmap:
  184.             bitmapdata = open(bitmap, 'rb').read()
  185.             bitmaplen = len(bitmapdata)
  186.         else:
  187.             bitmaplen = 0
  188.         file = open(installer_name, 'wb')
  189.         file.write(self.get_exe_bytes())
  190.         if bitmap:
  191.             file.write(bitmapdata)
  192.         
  193.         
  194.         try:
  195.             unicode
  196.         except NameError:
  197.             pass
  198.  
  199.         if isinstance(cfgdata, unicode):
  200.             cfgdata = cfgdata.encode('mbcs')
  201.         
  202.         cfgdata = cfgdata + '\x00'
  203.         if self.pre_install_script:
  204.             script_data = open(self.pre_install_script, 'r').read()
  205.             cfgdata = cfgdata + script_data + '\n\x00'
  206.         else:
  207.             cfgdata = cfgdata + '\x00'
  208.         file.write(cfgdata)
  209.         header = struct.pack('<iii', 305419899, len(cfgdata), bitmaplen)
  210.         file.write(header)
  211.         file.write(open(arcname, 'rb').read())
  212.  
  213.     
  214.     def get_installer_filename(self, fullname):
  215.         if self.target_version:
  216.             installer_name = os.path.join(self.dist_dir, '%s.win32-py%s.exe' % (fullname, self.target_version))
  217.         else:
  218.             installer_name = os.path.join(self.dist_dir, '%s.win32.exe' % fullname)
  219.         return installer_name
  220.  
  221.     
  222.     def get_exe_bytes(self):
  223.         get_build_version = get_build_version
  224.         import distutils.msvccompiler
  225.         cur_version = get_python_version()
  226.         if self.target_version and self.target_version != cur_version:
  227.             if self.target_version > cur_version:
  228.                 bv = get_build_version()
  229.             elif self.target_version < '2.4':
  230.                 bv = '6'
  231.             else:
  232.                 bv = '7.1'
  233.         else:
  234.             bv = get_build_version()
  235.         directory = os.path.dirname(__file__)
  236.         filename = os.path.join(directory, 'wininst-%s.exe' % bv)
  237.         return open(filename, 'rb').read()
  238.  
  239.  
  240.